#ifndef CONVOLUTION_OPERATOR_HPP
#define CONVOLUTION_OPERATOR_HPP

//------------------------------------------------------------------------------
// Fichier d'entête utilisés
//------------------------------------------------------------------------------
#include "Operator.hpp"
#include "GrayImage.hpp"
#include "Gradiant.hpp"
#include "Mask.hpp"

namespace ImageAnalysis
{
//----------------------------------------------------------------------
//Cette classe permet le calcul d'une image en niveaux de gris.
//A partir d'un masque prédéfini passé en paramètre, on va
// l'appliquer à chacun des pixels de l'image (sauf pour les bords)
// afin d'obtenir le gradient de cette image.
//----------------------------------------------------------------------
class ConvolutionOperator : public Operator
{
public:
    //----------------------------------------------------------------------
    // Structure
    //----------------------------------------------------------------------

    //----------------------------------------------------------------------
    // Constructeur
    //----------------------------------------------------------------------
    ConvolutionOperator( GrayImage* image, Gradiant* gradiant, Mask** masks, int nbMasks );

	//----------------------------------------------------------------------
    // Destructeur
    //----------------------------------------------------------------------
    virtual ~ConvolutionOperator();

	//----------------------------------------------------------------------
    // Méthode permettant de calculer le gradiant de l'image
    //----------------------------------------------------------------------
	virtual void Process( );

private:
		//----------------------------------------------------------------------
		//
		//----------------------------------------------------------------------
		GrayImage * currentImage;
		Gradiant* currentGradiant;
		Mask** convolutionMask;
		int numberOfMask;
		
		//----------------------------------------------------------------------
		//
		//----------------------------------------------------------------------
		unsigned char findMax(unsigned char* tableToStudy, int tableSize, int& indexMax);
		
        //----------------------------------------------------------------------
        // Constructeur par copie et oprérateur d'affectation en privée pour
        // interdire leur utilisation
        //----------------------------------------------------------------------
        ConvolutionOperator( const ConvolutionOperator& copy);
        ConvolutionOperator& operator=( const ConvolutionOperator& copy );
};

}
#endif //CONVOLUTION_OPERATOR_HPP
